

# 从 src 核心的通用模块导入所有内容
from src.Core.Common import *


class ISerializable(object):
    """
    序列化和反序列化的接口类。
    定义了序列化和反序列化的方法，任何需要实现序列化和反序列化功能的类都可以继承该接口。
    """

    def __init__(self):
        # 调用父类的构造函数
        super(ISerializable, self).__init__()

    def serialize(self, *args, **Kwargs):
        """
        实现对象如何进行序列化的方法。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError(
            "serialize method of ISerializable is not implemented"
        )

    def deserialize(self, jsonData):
        """
        实现对象如何进行反序列化的方法。

        :param jsonData: 包含对象序列化信息的 JSON 数据。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError(
            "deserialize method of ISerializable is not implemented"
        )


class IItemBase(ISerializable):
    """
    引脚和节点的基类接口。
    继承自 ISerializable 接口，提供了一些通用的属性和方法，用于管理引脚和节点的基本信息。

    .. py:method:: uid
        :property:

        :getter: 唯一标识符的访问器。

                :raises: :class:`NotImplementedError`

        :setter: 唯一标识符的设置器。

                :raises: :class:`NotImplementedError`
    """

    def __init__(self):
        # 调用父类的构造函数
        super(IItemBase, self).__init__()

    def getWrapper(self):
        """
        返回对 GUI 包装器的引用（如果存在）。

        :rtype: GUI 类的实例或 None
        """
        return None

    def setWrapper(self, wrapper):
        """
        设置 GUI 包装器。

        :param wrapper: GUI 类的实例。
        :type wrapper: 任意 GUI 类
        """
        pass

    @property
    def uid(self):
        """
        获取对象的唯一标识符。

        :raises NotImplementedError: 如果继承该接口的类没有实现此属性，将抛出此异常。
        """
        raise NotImplementedError("uid property of IItemBase should be implemented")

    @uid.setter
    def uid(self, value):
        """
        设置对象的唯一标识符。

        :param value: 新的唯一标识符。
        :raises NotImplementedError: 如果继承该接口的类没有实现此设置器，将抛出此异常。
        """
        raise NotImplementedError("uid setter of IItemBase should be implemented")

    @uid.deleter
    def uid(self):
        """
        删除对象的唯一标识符，此操作不被允许。

        :raises NotImplementedError: 尝试删除该属性时将抛出此异常。
        """
        raise NotImplementedError("uid property of IItemBase can not be deleted")

    def getName(self):
        """
        返回对象的名称。

        :rtype: str
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("getName method of IItemBase is not implemented")

    def setName(self, name):
        """
        设置对象的名称。

        :param name: 目标名称。
        :type name: str
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("setName method of IItemBase is not implemented")

    def kill(self):
        """
        移除对象。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("kill method of IItemBase is not implemented")

    def path(self):
        """
        返回对象的路径。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("path method of IItemBase is not implemented")


class IPin(IItemBase):
    """
    引脚接口类。
    定义了引脚的各种属性和方法，继承自 IItemBase 接口，用于规范引脚的行为。
    """

    def __init__(self):
        # 调用父类的构造函数
        super(IPin, self).__init__()

    @staticmethod
    def IsValuePin():
        """
        定义该引脚是否持有数据。
        例如，ExecPin 不是值引脚。

        :rtype: bool
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("IsValuePin method of IPin is not implemented")

    @staticmethod
    def color():
        """
        定义引脚的颜色。
        可由 GUI 包装器类使用。

        :returns: RGBA 元组。
        :rtype: tuple(0, 0, 0, 255)
        """
        return 255, 0, 0, 255

    def isExec(self):
        """
        判断该引脚是否可执行。

        :rtype: bool
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("isExec method of IPin is not implemented")

    def isArray(self):
        """
        判断该引脚是否持有值列表。

        :rtype: bool
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("isArray method of IPin is not implemented")

    def isAny(self):
        """
        判断该引脚是否为 Any 类型。

        :rtype: bool
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("isAny method of IPin is not implemented")

    @staticmethod
    def internalDataStructure():
        """
        静态提示该引脚的实际 Python 类型。

        :rtype: object
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError(
            "internalDataStructure method of IPin is not implemented"
        )

    @staticmethod
    def processData(data):
        """
        定义如何处理数据。

        :param data: 输入的数据。
        :returns: 处理后的数据。
        :rtype: object
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("processData method of IPin is not implemented")

    @staticmethod
    def supportedDataTypes():
        """
        支持的数据类型列表。
        可以转换为此类型的数据类型列表。例如 - int 可以支持 float，或者 vector3 可以支持 vector4 等。

        :rtype: list(object)
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError(
            "supportedDataTypes method of IPin is not implemented"
        )

    def defaultValue(self):
        """
        该引脚的默认值。

        :rtype: object
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("defaultValue method of IPin is not implemented")

    def getData(self):
        """
        定义如何返回该引脚的数据。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("getData method of IPin is not implemented")

    def setData(self, value):
        """
        定义如何将数据设置到引脚。

        :param value: 要设置的值。
        :type value: object
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("setData method of IPin is not implemented")

    def call(self, *args, **kwargs):
        """
        定义如何执行。此方法的作用是在另一个引脚上执行 `call` 操作，
        通过这种方式我们可以从左到右评估节点并定义控制流。
        """
        pass

    @property
    def dataType(self):
        """
        定义如何返回该引脚的数据类型。

        :rtype: str

        :setter: 定义如何设置该引脚的数据类型。
        """
        raise NotImplementedError("dataType getter method of IPin is not implemented")

    @dataType.setter
    def dataType(self, value):
        """
        设置该引脚的数据类型。

        :param value: 新的数据类型。
        :raises NotImplementedError: 如果继承该接口的类没有实现此设置器，将抛出此异常。
        """
        raise NotImplementedError("dataType setter method of IPin is not implemented")

    @staticmethod
    def jsonEncoderClass():
        """
        返回用于 JSON 编码的类。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("jsonEncoderClass method of IPin is not implemented")

    @staticmethod
    def jsonDecoderClass():
        """
        返回用于 JSON 解码的类。

        :raises NotImplementedError: 原注释有误，此处应提示该方法未实现，继承该接口的类没有实现此方法时将抛出此异常。
        """
        raise NotImplementedError("jsonDecoderClass method of IPin is not implemented")

    def setAsArray(self, bIsArray):
        """
        设置该引脚是否为数组类型。

        :param bIsArray: 布尔值，表示是否为数组类型。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("setAsArray method of IPin is not implemented")


class INode(IItemBase):
    """
    节点接口类。
    定义了节点的各种属性和方法，继承自 IItemBase 接口，用于规范节点的行为。
    """

    def __init__(self):
        # 调用父类的构造函数
        super(INode, self).__init__()

    def compute(self, *args, **kwargs):
        """
        节点的计算方法。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("compute method of INode is not implemented")

    def isCallable(self):
        """
        判断该节点是否可调用。

        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("isCallable method of INode is not implemented")

    def call(self, outPinName, *args, **kwargs):
        """
        按名称调用输出执行引脚。

        :param outPinName: 输出执行引脚的名称。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("call method of INode is not implemented")

    def createInputPin(
        self,
        pinName,
        dataType,
        defaultValue=None,
        callback=None,
        structure=StructureType.Single,
        constraint=None,
        structConstraint=None,
        supportedPinDataTypes=None,
        group="",
    ):
        """
        创建输入引脚。

        :param pinName: 引脚的名称。
        :param dataType: 引脚的数据类型。
        :param defaultValue: 引脚的默认值，默认为 None。
        :param callback: 引脚的回调函数，默认为 None。
        :param structure: 引脚的结构类型，默认为 StructureType.Single。
        :param constraint: 引脚的约束条件，默认为 None。
        :param structConstraint: 引脚结构的约束条件，默认为 None。
        :param supportedPinDataTypes: 支持的引脚数据类型列表，默认为 None。
        :param group: 引脚所属的组，默认为空字符串。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("createInputPin method of INode is not implemented")

    def createOutputPin(
        self,
        pinName,
        dataType,
        defaultValue=None,
        structure=StructureType.Single,
        constraint=None,
        structConstraint=None,
        supportedPinDataTypes=None,
        group="",
    ):
        """
        创建输出引脚。

        :param pinName: 引脚的名称。
        :param dataType: 引脚的数据类型。
        :param defaultValue: 引脚的默认值，默认为 None。
        :param structure: 引脚的结构类型，默认为 StructureType.Single。
        :param constraint: 引脚的约束条件，默认为 None。
        :param structConstraint: 引脚结构的约束条件，默认为 None。
        :param supportedPinDataTypes: 支持的引脚数据类型列表，默认为 None。
        :param group: 引脚所属的组，默认为空字符串。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("createOutputPin method of INode is not implemented")

    def getUniqPinName(self, name):
        """
        获取唯一的引脚名称。

        :param name: 目标引脚名称。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("getUniqPinName method of INode is not implemented")

    def postCreate(self, jsonTemplate=None):
        """
        节点创建后的处理方法。

        :param jsonTemplate: 包含节点信息的 JSON 模板，默认为 None。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("postCreate method of INode is not implemented")

    def setData(self, pinName, data, pinSelectionGroup):
        """
        设置指定引脚的数据。

        :param pinName: 目标引脚的名称。
        :param data: 要设置的数据。
        :param pinSelectionGroup: 引脚选择组。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("setData method of INode is not implemented")

    def getData(self, pinName, pinSelectionGroup):
        """
        获取指定引脚的数据。

        :param pinName: 目标引脚的名称。
        :param pinSelectionGroup: 引脚选择组。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("getData method of INode is not implemented")


class ICodeCompiler(object):
    """
    代码编译器接口类。
    定义了代码编译的方法。
    """

    def __init__(self, *args, **kwargs):
        # 调用父类的构造函数
        super(ICodeCompiler, self).__init__(*args, **kwargs)

    def compile(self, code):
        """
        编译代码。

        :param code: 要编译的代码。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError("compile method of ICodeCompiler is not implemented")


class IEvaluationEngine(object):
    """
    评估引擎接口类。
    定义了获取引脚数据的方法。
    """

    def __init__(self):
        # 调用父类的构造函数
        super(IEvaluationEngine, self).__init__()

    @staticmethod
    def getPinData(pin):
        """
        获取引脚的数据。

        :param pin: 目标引脚。
        :raises NotImplementedError: 如果继承该接口的类没有实现此方法，将抛出此异常。
        """
        raise NotImplementedError(
            "getPinData method of IEvaluationEngine is not implemented"
        )